// Go命令行

// 编译命令

// package main

// import "fmt"

// func main() {
// 	LibFunc()
// 	fmt.Println("this is main.go")
// }

/*
在当前目录下
/project-go/les15
1.go build 无参编译
2.go build -o les15-test.exe lib.go main.go

/project-go
在外层目录
go build ./les15

编译时压缩参数 -ldflags -s-w -s去掉符号信息，异常追踪stacktrace 没有文件名、行号信息
-w 是去掉DWARF调试信息，不能使用gdb调试
go build -o les15v2.exe -ldflags "-s-w" ./les15
*/

/*
run go run 的对象只能是单个或者多个go文件（必须同属于main包） 且不能为测试文件
os.Args 为命令行参数， 第一个参数为可执行文件的文件名，包含全路径
-work 可显示当前的编译目录
*/

// package main

// import (
// 	"fmt"
// 	"os"
// 	"time"
// )

// func main() {
// 	fmt.Println("os.Args:", os.Args)
// 	time.Sleep(time.Second * 10)

// }

// install 编译后安装

// 交叉编译  在一个平台上生成另一个平台上的可执行文件
/*
windows下编译 linux
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go

windows下编译 mac
SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build main.go

*/

// 代码获取 get
/*
go get 会把当前的代码包下载到GOPATH的第一个工作区的src目录并安装 （Git clone 下载源码，并编译安装）
-d 只下载不安装
-u 强制更新包和依赖
*/

/* 设置git 代理
http代理
git config --global http.proxy 'http://127.0.0.1:8080'
git config --global https.proxy 'https://127.0.0.1:8080'
socket代理
git config --global http.proxy 'socks5://127.0.0.1:8080'
git config --global https.proxy 'socks5://127.0.0.1:8080'
取消代理
git config --global --unset http.proxy
git config --global --unset https.proxy
*/

/*
格式化代码 fmt  开发工具vscode 有格式化插件
*/

/*
注释文档 doc

*/

/*代码测试
go test 用于 对go语言编写的代码包进行测试， 可指定测试的文件也可指定整个包测， 但需要包中含有测试文件， 测试
文件以"_test.go"
*/

// package main

// const PI float64 = 3.14

// //两数相加
// func Add(a, b int) int {
// 	return a + b
// }

// // 求圆的面积
// func Area(r float64) float64 {
// 	return PI * r * r
// }

// func main() {

// }

/*基准测试
基准测试提供可自定义的计时器和一套基准测试算法， 能方便快速的分析一段代码可能存在的CPU性能和内存分配went。
类似单元测试， 可打印出标准的测试报告
书写规范 ， 使用 “Benchmark” 为前缀， 后面加上需要测试的函数名， 冰使用 *testing.B 作为函数参数
ResetTimer() 重置计时器
StopTimer() 停止计时

*/

/*
覆盖率测试
用于统计程序包的测试有多少代码得到了执行。
go test -cover xxx.go
怎么查看哪些代码没测试


*/

/*
性能分析
性能分析和调优， 用于验证是否满足实际性能要求。go tool pprof 进行分析
需要安装图形依赖工具 Graphviz
1.文件查看结果
  top list  web 命令

2.http 用于对WEB程序进行分析 查看结果
 import _ "net/http/pprof"

*/
// package main

// import (
// 	"fmt"
// 	"os"
// 	"runtime/pprof"
// )

// const Num int = 10000

// func main() {
// 	f, _ := os.Create("cpu_file.prof")
// 	// 开始 性能分析
// 	pprof.StartCPUProfile(f)
// 	// 结束性能分析
// 	defer pprof.StopCPUProfile()
// 	var str string
// 	for i := 0; i < Num; i++ {
// 		str = fmt.Sprintf("%s%d", str, i)
// 	}
// }

package main

import (
	"fmt"
	"log"
	"net/http"
	_ "net/http/pprof"
)

const Num int = 10000

func concat_str(writer http.ResponseWriter, request *http.Request) {
	var str string
	for i := 0; i < Num; i++ {
		str = fmt.Sprintf("%s%d", str, i)
	}
}

func main() {
	http.HandleFunc("/str", concat_str)
	log.Fatal(http.ListenAndServe(":8080", nil))

}
